﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Systemet.Domain
{
    /// <summary>
    /// Controller för hantering av Intäkt/Kostnadsbudgetering
    /// </summary>

    class Budgetcontroller
    {
        private Views.BudgeteratResultat budMain;

        private Technical.AktivitetConnection aktivCon;
        private Technical.ProduktConnection budPrdReg;
        private Technical.BudgetConnection budCon;
        private Technical.KostnadsbudConnection kostBudCon;
        private Technical.PersonalConnection persCon;
        private Technical.RapportConnection rappCon;
        private List<Intäktsbudget> listOfIntäktsBudget;
        private List<ResursAllokeringar> ProdAllo;
        private List<AktivitetsAllokeringar> AktivitetAllo;
        private List<Personal> PersReg;
        private IEnumerable<Produktregister> listOfProductsInProdGroup;
        private IEnumerable<Personalavdelning> personalAvdelningRegister;
        private List<int> produktIntäktAndKostnader;
        private IEnumerable<Kontoregister> konton;
        private string radioButtonChecked;
        private double totalTillverkningskostnad;
        private double totalKostnadProdukt;
        private double schablonPerÅrsarb;
        private double tillverkningskostnadAllProducts;
        private double påläggFromAllProducts;
        private double summa;

        //Påläggsvariablen ska vara konstant när vyn öppnats för första gången
        public double PåläggFromAllProducts
        {
            get
            {
                if (summa > 0 || (totalTillverkningskostnad + calculateDirektaKostnader("") > 0))
                {
                    return påläggFromAllProducts != 0.0 ? påläggFromAllProducts : summa / (totalTillverkningskostnad + calculateDirektaKostnader(""));
                }
                else
                {
                    return 0;
                }
            }
            set { value = påläggFromAllProducts; }
        }

        //Initieringsvärden
        public Budgetcontroller()
        {
            aktivCon = new Technical.AktivitetConnection();
            budPrdReg = new Technical.ProduktConnection();
            budCon = new Technical.BudgetConnection();
            persCon = new Technical.PersonalConnection();
            kostBudCon = new Technical.KostnadsbudConnection();
            rappCon = new Technical.RapportConnection();

            listOfIntäktsBudget = new List<Intäktsbudget>();
            produktIntäktAndKostnader = new List<int>();
        }

        //Används av MainVy för att få bort bugg med att påläggFromAllProducts inte finns kvar vid 
        //RadioButton-byte (ny MainVy skapas och MainVy skapar ny budgetcontroller....)
        public Budgetcontroller(double pålägg)
        {
            aktivCon = new Technical.AktivitetConnection();
            budPrdReg = new Technical.ProduktConnection();
            budCon = new Technical.BudgetConnection();
            persCon = new Technical.PersonalConnection();
            kostBudCon = new Technical.KostnadsbudConnection();
            rappCon = new Technical.RapportConnection();
            listOfIntäktsBudget = new List<Intäktsbudget>();
            produktIntäktAndKostnader = new List<int>();
            påläggFromAllProducts = pålägg;
            PåläggFromAllProducts = pålägg;
        }

        //hämtar nuvarande avkastningskrav
        public int GetAvkastningaKrav()
        {
            return budCon.GetAvkastningsKrav();
        }
        //Sätter nytt avkastningskrav
        public bool SetAvkastningsKrav(int ammount)
        {
            return budCon.SetAvkastningsKrav(ammount);
        }

        //returnerar till main för att Updatera budgeteratResultat mainvy med produktlista filtrerar på namn (till datasource)
        public object updateBudResDGV(string filterWord)
        {
            object produkter = budPrdReg.GetProdukt("", "", "", filterWord, "");
            return produkter;
        }
        //returnerar till main för att Updatera budgeteratResultat mainvy med produktgrupper (till datasource)
        public object updateBudResDGVGrupp(string filterWord)
        {
            object produkter = budPrdReg.GetProductGroup(filterWord);
            return produkter;
        }
        //returnerar till main för att Updatera budgeteratResultat mainvy med produkter på Produktavdelning
        public object updateBudResDGVAvdelning()
        {
            object avdelningar = budCon.GetAllAvdelningar();
            return avdelningar;
        }
        //Uppdaterar budgeteratresultat mainvy med ifyllda sökkriterier (Triggar update)
        public void updateFöretagBudgetInformation()
        {
            // budMain.UpdateFöretag();
        }

        /// <summary>
        /// Körs vid start av Budgeterat resultat för att få fram ett påläggsvärde från alla produkter!
        /// Appliceras sedan i senare beräkningar!
        /// </summary>
        public void getPålägg()
        {
            //ta fram alla produkter
            listOfProductsInProdGroup = budPrdReg.getFiltreringskriterier();
            PersReg = kostBudCon.RetrieveStaffAllocations("");
            calculateSchablonkostnad();

            //Ny förbättrad version som inte tar år att genomföra?
            List<ResursAllokeringar> allResursAllo = new List<ResursAllokeringar>();
            ProdAllo = new List<ResursAllokeringar>();

            allResursAllo = budPrdReg.RetrieveProductAllo("");
            PersReg = kostBudCon.RetrieveStaffAllocations("");

            foreach (Produktregister p in listOfProductsInProdGroup)
            {
                foreach (ResursAllokeringar ra in allResursAllo)
                {
                    if (p.produktID.TrimEnd() == ra.ProduktID.TrimEnd())
                    {
                        ra.ProduktID.TrimEnd();
                        ProdAllo.Clear();
                        ProdAllo.Add(ra);
                        calculateTillverkningskostnad("resurs");

                        tillverkningskostnadAllProducts = tillverkningskostnadAllProducts + totalTillverkningskostnad;
                    }
                }
            }

            //ta fram pålägg
            calculatePålägg();
        }

        //Bestämmer vilken radiobutton i budgeteratresultat som ska triggas
        public void setRadioButton(string radiobutton)
        {
            budMain = (Views.BudgeteratResultat)AccessController.Instance.MainView;
            radioButtonChecked = radiobutton;
            budMain.setRadioButtonAndPålägg(radioButtonChecked, PåläggFromAllProducts);
        }

        //Triggar Filtreringskriterier beroende på vald radiobutton i sidVy
        public List<int> updateMainViewInformation(string ID, string radiobutton)
        {
            produktIntäktAndKostnader = new List<int>();

            if (radiobutton == "Produkt")
            {
                getProdctBudgetCost(ID);
            }
            else if (radiobutton == "Produktgrupp")
            {
                getProdctGroupBudgetCost(ID);
            }
            else if (radiobutton == "Avdelning")
            {
                getAvdelningBudgetCost(ID);
            }
            else if (radiobutton == "Företag")
            {
                getFöretagBudgetCost();
            }
            return produktIntäktAndKostnader;
        }

        //Hämtar budgeterade kostnader på ProduktID
        private void getProdctBudgetCost(string ID)
        {
            ProdAllo = new List<ResursAllokeringar>();
            AktivitetAllo = new List<AktivitetsAllokeringar>();
            PersReg = new List<Personal>();

            listOfIntäktsBudget.Clear();
            produktIntäktAndKostnader.Clear();

            listOfIntäktsBudget = budCon.GetProductsIntäktsregister(ID);
            ProdAllo = budPrdReg.RetrieveProductAllo(ID);
            AktivitetAllo = kostBudCon.GetActivityAllocations("");
            personalAvdelningRegister = kostBudCon.RetrieveStaffPercentages();

            if (listOfIntäktsBudget.Count > 0 || ProdAllo.Count > 0)
            {

                calculateIntäkt();
                calculateSchablonkostnad();
                PersReg = kostBudCon.RetrieveStaffAllocations("");

                totalTillverkningskostnad = 0;
                calculateTillverkningskostnad("resurs");
                int dirKost = calculateDirektaKostnader(ID);

                calculateTotalkostnad(totalTillverkningskostnad + (dirKost));
                produktIntäktAndKostnader.Add((int)(totalKostnadProdukt));
            }
            else
            {
                //Inga intäkter kopplade eller produktallokeringar, men kan ha direkta kostnader
                produktIntäktAndKostnader.Add(0);
                produktIntäktAndKostnader.Add(calculateDirektaKostnader(ID));
            }
        }

        //hämta budgeteradekostnader på produktgrupper, baserat på valt produktID
        private void getProdctGroupBudgetCost(string prodGruppID)
        {
            calculateSchablonkostnad();
            int prodGruppDirectCostTot = 0;
            listOfIntäktsBudget.Clear();
            listOfIntäktsBudget = rappCon.BudgetedProductGroupsReturnList(prodGruppID.TrimEnd());
            List<Produktregister> Produktlista = new List<Produktregister>();

            foreach (Produktregister p in budPrdReg.getFiltreringskriterier())
            {
                if (p.produktGruppID.TrimEnd() == prodGruppID.TrimEnd())
                    Produktlista.Add(p);
            }

            if (listOfIntäktsBudget.Count > 0 || Produktlista.Count > 0) //Lagt till så att det inte bara beror på Intäktsbudgeteringar
            {
                calculateIntäkt();

                PersReg = kostBudCon.RetrieveStaffAllocations("");

                totalTillverkningskostnad = 0;
                foreach (Produktregister p in Produktlista)
                {
                    ProdAllo = budPrdReg.RetrieveProductAllo(p.produktID);
                    calculateTillverkningskostnad("resurs");
                }

                //Calculates Direkt kostnad for prodgrupp
                foreach (ProduktKostnad p in budCon.BudgetedProductGroups(prodGruppID.TrimEnd()))
                {
                    prodGruppDirectCostTot = prodGruppDirectCostTot + ((int)p.Belopp * 1000);
                }

                calculateTotalkostnad(totalTillverkningskostnad + prodGruppDirectCostTot);

                produktIntäktAndKostnader.Add((int)(totalKostnadProdukt));
            }
            else
            {
                //Inga intäkter kopplade eller produktallokeringar, men kan ha direkta kostnader
                foreach (ProduktKostnad p in budCon.BudgetedProductGroups(prodGruppID))
                {
                    prodGruppDirectCostTot = prodGruppDirectCostTot + ((int)p.Belopp * 1000);
                }
                produktIntäktAndKostnader.Add(0);
                produktIntäktAndKostnader.Add(prodGruppDirectCostTot);
            }
        }

        //Hämtar budgeterad kostnad på en avdelning, baserat på valt avdelningsID
        private void getAvdelningBudgetCost(string avdelningsID)
        {
            int prodAvdDirectCostTot = 0;
            totalKostnadProdukt = 0;
            totalTillverkningskostnad = 0;
            calculateSchablonkostnad();
            // listOfProductsInProdGroup = new List<Produktregister>();
            List<Produktregister> prodList = new List<Produktregister>();

            foreach (Produktregister p in budPrdReg.getFiltreringskriterier())
            {
                if (p.avdelningsnamn.TrimEnd() == avdelningsID.TrimEnd())
                    prodList.Add(p);
            }

            listOfIntäktsBudget.Clear();
            listOfIntäktsBudget = rappCon.GetProduktOnPersonalAvdelning(avdelningsID.TrimEnd());

            AktivitetAllo = new List<AktivitetsAllokeringar>();

            // if (listOfIntäktsBudget.Count > 0)
            if (avdelningsID.Contains("Drift") || avdelningsID.Contains("Utv"))
            {
                calculateIntäkt();

                PersReg = kostBudCon.RetrieveStaffAllocations("");

                foreach (Produktregister p in prodList)
                {
                    ProdAllo = budPrdReg.RetrieveProductAllo(p.produktID);
                    calculateTillverkningskostnad("resurs");
                }

                //Calculates Direkt kostnad for prodgrupp!
                foreach (ProduktKostnad p in budCon.BudgetedProductAvdelning(avdelningsID))
                {
                    prodAvdDirectCostTot = prodAvdDirectCostTot + ((int)p.Belopp * 1000);
                }

                double totalLoneKostnad = 0;
                double manadslon = 0;
                double syssel = 0;
                double vakans = 0;
                double arsarb = 0;
                double schablon = 0;
                double departmentAllocation = 0;
                PersReg = kostBudCon.RetrieveStaffAllocations(avdelningsID);
                persCon = new Technical.PersonalConnection();

                IEnumerable<Personalavdelning> staffDepartment = persCon.retrievStaffdepartment("");

                foreach (Personal p in PersReg)
                {

                    manadslon = double.Parse(p.Månadslön);
                    syssel = double.Parse(p.Sysselsättningsgrad.ToString());
                    vakans = double.Parse(p.Vakansavdrag.ToString());
                    arsarb = (syssel / 100) - (vakans / 100);
                    foreach (Personalavdelning pA in staffDepartment)
                    {
                        if (pA.personnummer == p.Personnummer && pA.avdelningsnamn.Contains(avdelningsID))
                        {

                            departmentAllocation = Convert.ToDouble(pA.procentsats);
                            departmentAllocation = departmentAllocation / 100;

                        }
                    }
                    schablon = schablonPerÅrsarb * departmentAllocation;
                    totalLoneKostnad = totalLoneKostnad + (manadslon * 12 * departmentAllocation);
                    totalLoneKostnad += schablon;
                }
                double allocatedCosts = totalTillverkningskostnad;
                double costDifference = totalLoneKostnad - allocatedCosts;
                totalTillverkningskostnad += costDifference;


                double täckningsbidrag = (allocatedCosts + prodAvdDirectCostTot) * PåläggFromAllProducts;
                allocatedCosts = allocatedCosts + prodAvdDirectCostTot;
                totalKostnadProdukt = allocatedCosts + costDifference + täckningsbidrag;


                //  calculateTotalkostnad(totalTillverkningskostnad + prodAvdDirectCostTot);
                produktIntäktAndKostnader.Add((int)(totalKostnadProdukt));
            }
            else if (avdelningsID.Contains("Adm") || avdelningsID.Contains("mark"))
            {
                foreach (AktivitetsKostnad ak in aktivCon.GetAktivitetskostnadAvdelning(avdelningsID))
                {
                    prodAvdDirectCostTot = prodAvdDirectCostTot + ((int)ak.Belopp * 1000);
                }
                //Plocka fram Lönekostnad!

                foreach (AktivitetsAllokeringar ak in kostBudCon.GetActivityAllocations(""))
                {
                    if (ak.Avdelningsnamn.TrimEnd() == avdelningsID)
                    {
                        AktivitetAllo.Add(ak);
                    }
                }

                calculateTillverkningskostnad("aktivitet");

                double totalLoneKostnad = 0;
                double manadslon = 0;
                double syssel = 0;
                double vakans = 0;
                double arsarb = 0;
                double schablon = 0;
                PersReg = kostBudCon.RetrieveStaffAllocations(avdelningsID);
                foreach (Personal p in PersReg)
                {

                    manadslon = double.Parse(p.Månadslön);
                    syssel = double.Parse(p.Sysselsättningsgrad.ToString());
                    vakans = double.Parse(p.Vakansavdrag.ToString());
                    arsarb = (syssel / 100) - (vakans / 100);
                    schablon = schablonPerÅrsarb * arsarb;
                    totalLoneKostnad = totalLoneKostnad + (manadslon * 12 * arsarb);
                    totalLoneKostnad += schablon;
                }

                int totalAdmFor = Convert.ToInt32(totalLoneKostnad + prodAvdDirectCostTot);

                produktIntäktAndKostnader.Add(0);
                produktIntäktAndKostnader.Add(totalAdmFor);
            }
            else
            {
                foreach (ProduktKostnad p in budCon.BudgetedProductAvdelning(avdelningsID))
                {
                    prodAvdDirectCostTot = prodAvdDirectCostTot + ((int)p.Belopp * 1000);
                }
                produktIntäktAndKostnader.Add(0);
                produktIntäktAndKostnader.Add(prodAvdDirectCostTot);
            }
        }

        //Hämtar hela företagets budgeteradekostnad
        private void getFöretagBudgetCost()
        {
            calculateSchablonkostnad();
            //listOfProductsInProdGroup = new List<Produktregister>();
            List<Produktregister> listOfProducts = new List<Produktregister>();

            List<ResursAllokeringar> allResursAllo = new List<ResursAllokeringar>();
            ProdAllo = new List<ResursAllokeringar>();

            listOfIntäktsBudget.Clear();
            listOfIntäktsBudget = rappCon.BudgetedProductCompanyReturnList();

            int företagDirektKostnad = 0;
            totalKostnadProdukt = 0;
            foreach (Produktregister p in budPrdReg.getFiltreringskriterier())
            {
                listOfProducts.Add(p);
            }

            produktIntäktAndKostnader.Clear();

            // listOfIntäktsBudget = budCon.GetAllIntäktsbudgetAllProducts();
            totalTillverkningskostnad = 0;
            calculateIntäkt();

            allResursAllo = budPrdReg.RetrieveProductAllo("");

            PersReg = kostBudCon.RetrieveStaffAllocations("");

            foreach (Produktregister p in listOfProducts)
            {
                foreach (ResursAllokeringar ra in allResursAllo)
                {
                    if (p.produktID.TrimEnd() == ra.ProduktID.TrimEnd())
                    {
                        ra.ProduktID.TrimEnd();
                        ProdAllo.Clear();
                        ProdAllo.Add(ra);
                        calculateTillverkningskostnad("resurs");
                    }
                }
            }

            List<ProduktKostnad> prodKost = new List<ProduktKostnad>();

            prodKost = budCon.GetProduktKonto("");
            PersReg = kostBudCon.RetrieveStaffAllocations("");
            // PersReg.AddRange(kostBudCon.RetrieveStaffAllocations("Utv"));
            List<Personal> tempStaff = new List<Personal>();
            double totalLoneKostnad = 0;
            double manadslon = 0;
            double syssel = 0;
            double vakans = 0;
            double arsarb = 0;
            double schablon = 0;
            foreach (Personal p in PersReg)
            {
                bool added = false;
                foreach (Personal x in tempStaff)
                {
                    if (x.Personnummer == p.Personnummer)
                    {
                        added = true;
                    }
                }
                if (!added)
                {
                    manadslon = double.Parse(p.Månadslön);
                    syssel = double.Parse(p.Sysselsättningsgrad.ToString());
                    vakans = double.Parse(p.Vakansavdrag.ToString());
                    arsarb = (syssel / 100) - (vakans / 100);
                    schablon = schablonPerÅrsarb * arsarb;
                    totalLoneKostnad = totalLoneKostnad + (manadslon * 12 * arsarb);
                    totalLoneKostnad += schablon;
                    tempStaff.Add(p);
                }

            }
            double allocatedCosts = totalTillverkningskostnad;
            double costDifference = totalLoneKostnad - allocatedCosts;

            foreach (ProduktKostnad pk in prodKost)
            {
                if (!pk.Kontonummer.Contains("5021"))
                    företagDirektKostnad = företagDirektKostnad + ((int)pk.Belopp * 1000);
            }


            double täckningsbidrag = (allocatedCosts + företagDirektKostnad) * PåläggFromAllProducts;
            allocatedCosts = allocatedCosts + företagDirektKostnad;
            totalKostnadProdukt = allocatedCosts + costDifference + täckningsbidrag;

            //calculateTotalkostnad(totalTillverkningskostnad + företagDirektKostnad);

            List<AktivitetsKostnad> akList = new List<AktivitetsKostnad>(aktivCon.GetAktivitetskostnadAvdelning("Adm"));

            //AKTIVITETSKOSTNAD
            int prodAvdDirectCostTot = 0;
            //foreach (AktivitetsKostnad ak in aktivCon.GetAktivitetskostnadAvdelning("Adm"))
            foreach (AktivitetsKostnad ak in akList)
            {
                if (!ak.Kontonummer.Contains("5021"))
                    prodAvdDirectCostTot = prodAvdDirectCostTot + ((int)ak.Belopp * 1000);
            }

            akList.Clear();
            akList = aktivCon.GetAktivitetskostnadAvdelning("För/mark");
            foreach (AktivitetsKostnad ak in akList)
            {
                if (!ak.Kontonummer.Contains("5021"))
                    prodAvdDirectCostTot = prodAvdDirectCostTot + ((int)ak.Belopp * 1000);
            }
            totalTillverkningskostnad = 0;
            AktivitetAllo = kostBudCon.GetActivityAllocations("");
            calculateTillverkningskostnad("aktivitet");

            produktIntäktAndKostnader.Add((int)(totalKostnadProdukt + prodAvdDirectCostTot));
        }


        // ------- BERÄKNINGAR ------- //
        private void calculateIntäkt()
        {
            int intäktsbudget = 0;
            foreach (Intäktsbudget it in listOfIntäktsBudget)
            {
                if (it.Budget > 0)
                    intäktsbudget = intäktsbudget + ((int)it.Budget * 1000);
            }
            if (intäktsbudget > 0)
                produktIntäktAndKostnader.Add(intäktsbudget);
            else
                produktIntäktAndKostnader.Add(0);
        }

        private void calculateTillverkningskostnad(string resursOrAktivitet)
        {
            double månadslön = 0;
            double lönekostnad = 0;
            double procentsats = 0;
            double schablonkostnad = 0;
            int i = 0;
            double EjbudgeteradLon = 0; ;
            PersReg = kostBudCon.RetrieveStaffAllocations("");

            foreach (Personal p in PersReg)
            {
                if (resursOrAktivitet.Contains("resurs"))
                {
                    foreach (ResursAllokeringar pa in ProdAllo)
                    {
                        if (p.Personnummer == pa.PersNr)
                        {
                            procentsats = ((double)pa.ProcentSats / 100);
                            månadslön = double.Parse(p.Månadslön);
                            lönekostnad = (månadslön * procentsats * 12);
                            schablonkostnad = schablonPerÅrsarb * procentsats;
                            totalTillverkningskostnad = totalTillverkningskostnad + lönekostnad + schablonkostnad;

                        }
                    }

                }
                else if (resursOrAktivitet.Contains("aktivitet"))
                {
                    foreach (AktivitetsAllokeringar pa in AktivitetAllo)
                    {
                        if (p.Personnummer == pa.PersNr)
                        {
                            procentsats = ((double)pa.Procentsats / 100);
                            månadslön = double.Parse(p.Månadslön);
                            lönekostnad = (månadslön * procentsats * 12);
                            totalTillverkningskostnad = totalTillverkningskostnad + lönekostnad;
                        }
                    }
                }
            }
        }

        private void calculateSchablonkostnad()
        {
            //konton = new List<Konto>();
            List<Personalregister> personal = new List<Personalregister>();

            personal = persCon.RetrieveStaff();

            double totalÅrsarb = 0;
            double totalsumma = 0;
            double tempSysVak = 0;
            schablonPerÅrsarb = 0;

            //Not adding konto 5021 (lönekonto) and 9999 (avkastningskrav)!
            //konton = kostBudCon.GetKonto("1", "5020");
            //konton.AddRange(kostBudCon.GetKonto("5022", "9998"));
            double tempVakans;
            konton = kostBudCon.getKonton();

            foreach (Personalregister p in personal)
            {
                tempVakans = p.Vakansavdrag;
                tempSysVak = (Convert.ToDouble(p.Sysselsättningsgrad) - Convert.ToDouble(tempVakans)) / 100;
                totalÅrsarb = totalÅrsarb + tempSysVak;
            }

            foreach (Kontoregister k in konton)
            {
                if (k.Kostnadskontoregister.schablonkostnader != null)
                    totalsumma = totalsumma + ((double)k.Kostnadskontoregister.schablonkostnader * 1000);
            }
            if (totalsumma > 0 && totalÅrsarb > 0)
            {
                schablonPerÅrsarb = totalsumma / totalÅrsarb;
            }
            else
            {
                schablonPerÅrsarb = 0;
            }
        }

        //Plocka ut alla konton med belopp som är kopplade till prodID
        private int calculateDirektaKostnader(string prodID)
        {
            int currentBelopp = 0;
            int totalDirektaKostnader = 0;

            foreach (ProduktKostnad pk in budCon.GetProduktKonto(prodID))
            {
                if (pk.Belopp != null && pk.ProduktID.TrimEnd() == prodID.TrimEnd() || prodID == "")
                {
                    currentBelopp = ((int)pk.Belopp * 1000);
                    totalDirektaKostnader = totalDirektaKostnader + currentBelopp;
                }
            }

            return totalDirektaKostnader;
        }

        /// <summary>
        /// Körs endast en gång, vid start av modul
        /// 
        /// MARKNADSAVDELNING Lönekostnader + Schablonkostnader + direkta kostnader för aktiviteter
        /// ADMINISTRATIVA Lönekostnader + Schablonkostnader + direkta kostnader för aktiviteter
        /// MARKNADSAVDELNING + ADMINISTRATIVA = summa;
        /// summa + avkastningskrav
        /// summa / This.product((löne+schablon)+direktakostnader)
        /// </summary>
        private void calculatePålägg()
        {
            personalAvdelningRegister = kostBudCon.RetrieveStaffPercentages();
            summa = 0;
            double allEmployeeAdmMarkLön = 0;
            double currentBelopp = 0;
            double direktaKostnaderAktivitet = 0;
            double avkastningskrav = 0;
            påläggFromAllProducts = 0;
            totalKostnadProdukt = 0;

            double markAdmSchablon = 0;

            double årsarbetare = 0;
            double månadslön = 0;
            double lönekostnad = 0;
            double procentsats = 0;
            double täckningsbidrag = 0;

            //LÖNEKOSTNADER FÖR MARKNAD & ADMINISTRATION
            foreach (Personalavdelning pa in personalAvdelningRegister)
            {
                if (pa.avdelningsnamn.Contains("Adm") || pa.avdelningsnamn.Contains("mark"))
                {
                    procentsats = ((double)pa.procentsats / 100);
                    årsarbetare = årsarbetare + procentsats;
                    if (pa.Månadslön != null)
                        månadslön = double.Parse(pa.Månadslön);
                    lönekostnad = (månadslön * procentsats * 12);
                    allEmployeeAdmMarkLön = allEmployeeAdmMarkLön + lönekostnad;
                }
            }

            //SCHABLONKOSTNAD FÖR MARKNAD & ADMINISTRATION
            markAdmSchablon = schablonPerÅrsarb * årsarbetare;

            //DIREKTA KOSTNADER
            foreach (Aktivitetskostnad ak in budCon.GetAktivitetKonto(""))
            {
                if (ak.belopp != null)
                {
                    currentBelopp = (int)ak.belopp;
                    direktaKostnaderAktivitet = direktaKostnaderAktivitet + currentBelopp;
                }
            }

            //AVKASTNINGSKRAV
            int tempvalue = budCon.GetAvkastningsKrav();
            if (tempvalue > 0)
            {
                //Avkastningskrav fullt utskrivet!
                avkastningskrav = (tempvalue * 1000);
            }

            summa = allEmployeeAdmMarkLön + markAdmSchablon + (direktaKostnaderAktivitet * 1000);
            summa = summa + avkastningskrav;
            double dirCosts = calculateDirektaKostnader("");
            PåläggFromAllProducts = summa / (totalTillverkningskostnad + calculateDirektaKostnader(""));
            täckningsbidrag = (totalTillverkningskostnad + dirCosts) * PåläggFromAllProducts;

            totalKostnadProdukt = totalTillverkningskostnad + täckningsbidrag;
        }

        //Beräknar totalkostnaden 
        private void calculateTotalkostnad(double tillverkningskostnad)
        {
            double täckningsbidrag = tillverkningskostnad * PåläggFromAllProducts;
            totalKostnadProdukt = tillverkningskostnad + täckningsbidrag;
        }

        //Låser kostnadsbudget
        public void setKostIntBudLockedValue()
        {
            foreach (ResursAllokeringar ra in budPrdReg.RetrieveProductAllo(""))
            {
                if (ra.Låst)
                {
                    AccessController.Instance.KostnadsBudgetUnlocked = false;
                    break;
                }
            }

            foreach (Intäktsbudgetregister ib in budCon.GetAllIntäktsbudgetAllProducts())
            {
                if (ib.låst)
                {
                    AccessController.Instance.IntäktsbudgetUnlocked = false;
                    break;
                }
            }
        }
    }
}
